package com.aseo.business;

import java.sql.Timestamp;
import java.util.List;
import java.util.Set;

import javax.annotation.Resource;
import javax.validation.ConstraintViolation;

import org.springframework.stereotype.Service;

import com.aseo.exception.ConstraintViolationException;
import com.aseo.model.dao.Dao;
import com.aseo.model.entity.CatalogoReclamoEstado;
import com.aseo.model.entity.CierreReclamo;
import com.aseo.model.entity.Reclamo;
import com.aseo.model.entity.ReclamoEstado;

//@Service
public class CierreReclamoManager {

	@Resource  
	private Dao dao;
	
	public CierreReclamo newCierreReclamo() {  
		return new CierreReclamo();  
	}  
	  
	public void persist(CierreReclamo cierreReclamo) {
		 cerrarReclamo(cierreReclamo.getIdReclamo());
		 cierreReclamo.setFechaHora(new Timestamp(System.currentTimeMillis()));
		 dao.persist(cierreReclamo);
	}
	  
	private void cerrarReclamo(Reclamo reclamo) {
		 reclamo.setIdCatalogoReclamoEstado(CatalogoReclamoEstado.CERRADO);
		 List<ReclamoEstado> reclamoEstados = dao.find("SELECT reclamoEstado FROM com.aseo.model.entity.ReclamoEstado reclamoEstado " +
				                                      "WHERE reclamoEstado.actual = true " +
				                                      "AND reclamoEstado.idReclamo = " + reclamo.getIdReclamo()); 
		 if (!reclamoEstados.isEmpty()) {
			 ReclamoEstado reclamoEstadoAnterior = reclamoEstados.get(reclamoEstados.size() - 1);
			 reclamoEstadoAnterior.setActual(false);
			 dao.persist(reclamoEstadoAnterior);
		 }
		 
		 ReclamoEstado reclamoEstado = new ReclamoEstado();
		 reclamoEstado.setIdReclamo(reclamo);
		 reclamoEstado.setIdCatalogoReclamoEstado(CatalogoReclamoEstado.CERRADO);
		 reclamoEstado.setActual(true);
		 reclamoEstado.setFechaHora(new Timestamp(System.currentTimeMillis()));
		 dao.persist(reclamoEstado);
		 dao.persist(reclamo);
	}

	public List<CierreReclamo> getCierreReclamos() {  
		final List<CierreReclamo> list = dao.find(CierreReclamo.class);  
	    return list;
	}
	
	public CierreReclamo get(Long idCierreReclamo) {
		return dao.get(CierreReclamo.class, idCierreReclamo);
	}
	
	public void validate(CierreReclamo cierreReclamo) throws ConstraintViolationException {

		Set<ConstraintViolation<CierreReclamo>> constraintViolations = dao.validate(cierreReclamo);
		
		for (ConstraintViolation<CierreReclamo> constraintViolation : constraintViolations) {
			throw new ConstraintViolationException(constraintViolation.getMessage());
		}
	}

}